Eventy v IB, jak je osetrit

Otázka od: Petr Selinger

26. 9. 2002 15:10

Zdravim,
  resim nasledujici problem: v Databazi mam trigger, ktery
vyvola Event kdyz pribude v tabulce zaznam (After Insert).
V programu tento event odchytnu a zaznam(y) zpracuju.

Problem je, kdyz mi techto zaznamu pribude v tabulce najednou
nekolik ve shlucich. Event se nejspis vyvolava nekolikrat a ja
pak nektere zaznamy ztracim. Nacitani je reseno selectem na
tabulku, kde se vyberou vsechny zaznamy vetsi nez posledni
nactene poradove cislo.

Posloupnost:

Po vyvolani Eventu:
1. select * from tabulka where id > last_id
2. prochazim dataset a ukladam zaznamy nekam jinam
3. ziskani maximalniho cisla id z tabulky a ulozeni do last_id

Myslim si, ze kdyz se Event vyvola v jeden casovy okamzik
vicekrat, procedura se spousti paralelne a ja ztracim zaznamy.
Napadlo me to osetrit pomoci TCriticalSection, ale nejak to
nezafungovalo.

Neresil nekdo neco podobneho?

Diky, Petr

IB 6.0.1, D5 UP2







--------------------
Vyhrajte skútr Peugeot na www.superliga.cz . Založte si svůj tým a hrajte s
námi !


Odpovedá: Pavel Cisar

26. 9. 2002 17:57

Haj hou!

Reakce na udalost kterou popisujes se dela hned v eventu na komponente
TIBEvent ? Zpracovani / prijem eventu by mel byt co nejkratsi, protoze se
provadi v samostatnem vlaknu. I kdyz si ted nejsem jisty implementaci v
soucasnem IBX (nebo co pouzivas), zda nahodou nesynchronizuje osetreni do
hlavniho vlakna. Tak jako tak bych doporucil (pokud si to muzes dovolit z
casovych duvodu) nastavit pouze priznak zmeny, a skutecne zpracovani
(vyber dat atd.) provadet v OnIdle aplikace.

S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase